package org.ttitfly.workflow.engine;

import org.ttitfly.workflow.exception.ProcessRunException;

/**
 * 动作，动作由活动或流程发起执行，流程触发活动执行动作后将使流程进入后续活动，外部程序也可执行一个动作触发流程运行。
 * <p>
 * 活动执行动作之后，将返回动作指向的后续运行单元的名称，但只能返回一个，若确实需要返回多个结果或者其它需要鉴别模式的才能确定的结果，则应返回一个
 * <code>Decision</code> 类型的运行单元名称，该单元运行时将有能力触发流程根据相关条件或各种鉴别模式来调度单个或多个活动并行运行。
 * 调用方最终根据动作执行后返回的名称进行新的运行单元调度，如此保证流程推进运行， 动作也将负责执行用户的业务逻辑。
 * </p>
 * 
 * <p>
 * 若该动作没有指向后续单元，则应返回<code>null</code>，这通常意味着流程的一个分支或者整个流程运行完成。
 * </p>
 * 
 * <p>
 * 若由流程发起执行，则该动作必须是流程的启动动作之一，将触发流程开始运行。
 * </p>
 * 
 * @author 潘海春
 * @version 2009-9-8
 * @see Activity
 * @see Process
 */
public interface Action {

	/**
	 * 名称，在同一个运行单元中唯一
	 * 
	 * @return
	 */
	String getName();
	
	/**
	 * 结果状态，任务执行完成后的状态标识
	 * 
	 * @return
	 */
	String getStatus();

	/**
	 * 由活动或者流程发起调用，负责执行用户的业务逻辑。若该动作指向一个后续运行单元，则应该返回该运行单元的名字，
	 * 由调用方决策是否应该触发流程调度该运行单元运行，否则将可能导致流程无法按照预期运行。若该动作没有指向后续单元，则应返回
	 * <code>null</code>，这通常意味着流程的一个分支或者整个流程运行完成。
	 * 
	 * @return 后续运行单元的名称，<code>null</code>表示一条流程分支执行完成，或者流程全部执行完成。
	 * @throws ProcessRunException
	 *             执行过程抛出的异常将被包装成本异常抛出。
	 */
	String execute() throws ProcessRunException;

}
